package com.athena.framework.beanfactory;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;

public interface BeanFactory {

    /**
     * 添加bean
     * @param object
     */
    void addBean(Object object);

    /**
     * 根据名称添加bean
     * @param beanName
     * @param object
     */
    void addBean(String beanName,Object object);

    /**
     * 获取bean
     * @param clazz
     * @param <T>
     * @return
     */
    <T> T getBean(Class<T> clazz);


    /**
     * 获取bean
     * @param beanName
     * @return
     */
    Object getBean(String beanName);

    /**
     * 根据class查找框架托管的对象
     * @param clazz
     * @param <T>
     * @return
     */
    <T> List<T> findBeanByClass(Class<T> clazz);

    /**
     * 遍历被托管的实例
     * @param action
     */
    void forEach(BiConsumer<String, Object> action);

    /**
     * 查找其子类或实现类
     * @param type
     * @return
     */
    Map<String,Object> findSubclass(Class<?> type);

    /**
     * 获取所有被托管类的key
     * @return
     */
    Set<String> getKeySet();

    /**
     * 根据key设置值
     * @param key
     * @param bean
     */
    void setBean(String key,Object bean);
}
